package reconhecimento;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.JPanel;

import reconhecimento.model.Imagem;
import reconhecimento.util.Constantes;

public class JPImagem extends JPanel {
	protected boolean pintar = true;

	private Imagem imagem;

	private byte[][] pixels;

	private int escala;

	public JPImagem(int xInicial, int yInicial, int escala) {
		this.escala = escala;
//		this.setSize(Constantes.LARGURA_PADRAO * escala,
//				Constantes.ALTURA_PADRAO * escala);
		this.setBounds(new Rectangle(xInicial, yInicial, (Constantes.LARGURA_PADRAO * escala), (Constantes.ALTURA_PADRAO * escala)));
		pixels = new byte[Constantes.ALTURA_PADRAO][Constantes.LARGURA_PADRAO];
		this.imagem = new Imagem(Constantes.LARGURA_PADRAO,
				Constantes.ALTURA_PADRAO, pixels);
		this.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent e) {
				pintar(e.getX(), e.getY());
			}
		});
		this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			public void mouseDragged(java.awt.event.MouseEvent e) {
				pintar(e.getX(), e.getY());
			}
		});
	}

	protected void pintar(int x, int y) {
		try {
			int posX = (int) Math.floor(x / escala), posY = (int) Math.floor(y
					/ escala);
			if (dentroPanel(x, y)) {
				if (pintar) {
					this.pixels[posY][posX] = 1;
				} else {
					this.pixels[posY][posX] = 0;
				}
			}
			this.repaint();
		} catch (RuntimeException e) {
			//TODO Otimizar pra naum dar ArrayIndexOutOfBoundsException 
//			e.printStackTrace();
		}
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		this.setBackground(new Color(255, 255, 255));
		for (int i = 0; i < pixels.length; i++) {
			for (int j = 0; j < pixels[i].length; j++) {
				if (this.pixels[i][j] == 1) {
					int posX = j * escala;
					int posY = i * escala;
					for (int k = 0; k < escala; k++) {
						g.drawLine(posX, posY + k, posX + escala, posY + k);
					}
				}
			}
		}
	}

	protected boolean dentroPanel(int x, int y) {
		if (x < 0 || x > this.getWidth()) {
			return false;
		}
		if (y < 0 || y > this.getHeight()) {
			return false;
		}
		return true;
	}

	public void setPintar(boolean pintar) {
		this.pintar = pintar;
	}

	public Imagem getImagem() {
		return this.imagem;
	}

	public void setImagem(Imagem imagem) {
		this.imagem = imagem;
	}

	public void apagarTudo() {
		for (int i = 0; i < pixels.length; i++) {
			for (int j = 0; j < pixels[i].length; j++) {
				this.pixels[i][j] = 0;
			}
		}
		this.repaint();
	}

}
